{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from fastai import *\n",
    "from fastai.tabular import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Rossmann"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preparation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To create the feature-engineered train_clean and test_clean from the Kaggle competition data, run `rossman_data_clean.ipynb`. One important step that deals with time series is this:\n",
    "\n",
    "```python\n",
    "add_datepart(train, \"Date\", drop=False)\n",
    "add_datepart(test, \"Date\", drop=False)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "path = Path('data/rossmann/')\n",
    "train_df = pd.read_pickle(path/'train_clean')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Store</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DayOfWeek</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <td>2015-07-31 00:00:00</td>\n",
       "      <td>2015-07-31 00:00:00</td>\n",
       "      <td>2015-07-31 00:00:00</td>\n",
       "      <td>2015-07-31 00:00:00</td>\n",
       "      <td>2015-07-31 00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sales</th>\n",
       "      <td>5263</td>\n",
       "      <td>6064</td>\n",
       "      <td>8314</td>\n",
       "      <td>13995</td>\n",
       "      <td>4822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Customers</th>\n",
       "      <td>555</td>\n",
       "      <td>625</td>\n",
       "      <td>821</td>\n",
       "      <td>1498</td>\n",
       "      <td>559</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Open</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>StateHoliday</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SchoolHoliday</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Year</th>\n",
       "      <td>2015</td>\n",
       "      <td>2015</td>\n",
       "      <td>2015</td>\n",
       "      <td>2015</td>\n",
       "      <td>2015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Month</th>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Week</th>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Day</th>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dayofweek</th>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dayofyear</th>\n",
       "      <td>212</td>\n",
       "      <td>212</td>\n",
       "      <td>212</td>\n",
       "      <td>212</td>\n",
       "      <td>212</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_month_end</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_month_start</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_quarter_end</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_quarter_start</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_year_end</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Is_year_start</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Elapsed</th>\n",
       "      <td>1438300800</td>\n",
       "      <td>1438300800</td>\n",
       "      <td>1438300800</td>\n",
       "      <td>1438300800</td>\n",
       "      <td>1438300800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>StoreType</th>\n",
       "      <td>c</td>\n",
       "      <td>a</td>\n",
       "      <td>a</td>\n",
       "      <td>c</td>\n",
       "      <td>a</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Assortment</th>\n",
       "      <td>a</td>\n",
       "      <td>a</td>\n",
       "      <td>a</td>\n",
       "      <td>c</td>\n",
       "      <td>a</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionDistance</th>\n",
       "      <td>1270</td>\n",
       "      <td>570</td>\n",
       "      <td>14130</td>\n",
       "      <td>620</td>\n",
       "      <td>29910</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionOpenSinceMonth</th>\n",
       "      <td>9</td>\n",
       "      <td>11</td>\n",
       "      <td>12</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionOpenSinceYear</th>\n",
       "      <td>2008</td>\n",
       "      <td>2007</td>\n",
       "      <td>2006</td>\n",
       "      <td>2009</td>\n",
       "      <td>2015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo2SinceWeek</th>\n",
       "      <td>1</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Min_Sea_Level_PressurehPa</th>\n",
       "      <td>1015</td>\n",
       "      <td>1017</td>\n",
       "      <td>1017</td>\n",
       "      <td>1014</td>\n",
       "      <td>1016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Max_VisibilityKm</th>\n",
       "      <td>31</td>\n",
       "      <td>10</td>\n",
       "      <td>31</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mean_VisibilityKm</th>\n",
       "      <td>15</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Min_VisibilitykM</th>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Max_Wind_SpeedKm_h</th>\n",
       "      <td>24</td>\n",
       "      <td>14</td>\n",
       "      <td>14</td>\n",
       "      <td>23</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mean_Wind_SpeedKm_h</th>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>5</td>\n",
       "      <td>16</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Max_Gust_SpeedKm_h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Precipitationmm</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CloudCover</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Events</th>\n",
       "      <td>Fog</td>\n",
       "      <td>Fog</td>\n",
       "      <td>Fog</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WindDirDegrees</th>\n",
       "      <td>13</td>\n",
       "      <td>309</td>\n",
       "      <td>354</td>\n",
       "      <td>282</td>\n",
       "      <td>290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>StateName</th>\n",
       "      <td>Hessen</td>\n",
       "      <td>Thueringen</td>\n",
       "      <td>NordrheinWestfalen</td>\n",
       "      <td>Berlin</td>\n",
       "      <td>Sachsen</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionOpenSince</th>\n",
       "      <td>2008-09-15 00:00:00</td>\n",
       "      <td>2007-11-15 00:00:00</td>\n",
       "      <td>2006-12-15 00:00:00</td>\n",
       "      <td>2009-09-15 00:00:00</td>\n",
       "      <td>2015-04-15 00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionDaysOpen</th>\n",
       "      <td>2510</td>\n",
       "      <td>2815</td>\n",
       "      <td>3150</td>\n",
       "      <td>2145</td>\n",
       "      <td>107</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CompetitionMonthsOpen</th>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo2Since</th>\n",
       "      <td>1900-01-01 00:00:00</td>\n",
       "      <td>2010-03-29 00:00:00</td>\n",
       "      <td>2011-04-04 00:00:00</td>\n",
       "      <td>1900-01-01 00:00:00</td>\n",
       "      <td>1900-01-01 00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo2Days</th>\n",
       "      <td>0</td>\n",
       "      <td>1950</td>\n",
       "      <td>1579</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo2Weeks</th>\n",
       "      <td>0</td>\n",
       "      <td>25</td>\n",
       "      <td>25</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AfterSchoolHoliday</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BeforeSchoolHoliday</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AfterStateHoliday</th>\n",
       "      <td>57</td>\n",
       "      <td>67</td>\n",
       "      <td>57</td>\n",
       "      <td>67</td>\n",
       "      <td>57</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BeforeStateHoliday</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AfterPromo</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BeforePromo</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SchoolHoliday_bw</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>StateHoliday_bw</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo_bw</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SchoolHoliday_fw</th>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>StateHoliday_fw</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Promo_fw</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>93 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             0                    1  \\\n",
       "index                                        0                    1   \n",
       "Store                                        1                    2   \n",
       "DayOfWeek                                    5                    5   \n",
       "Date                       2015-07-31 00:00:00  2015-07-31 00:00:00   \n",
       "Sales                                     5263                 6064   \n",
       "Customers                                  555                  625   \n",
       "Open                                         1                    1   \n",
       "Promo                                        1                    1   \n",
       "StateHoliday                             False                False   \n",
       "SchoolHoliday                                1                    1   \n",
       "Year                                      2015                 2015   \n",
       "Month                                        7                    7   \n",
       "Week                                        31                   31   \n",
       "Day                                         31                   31   \n",
       "Dayofweek                                    4                    4   \n",
       "Dayofyear                                  212                  212   \n",
       "Is_month_end                              True                 True   \n",
       "Is_month_start                           False                False   \n",
       "Is_quarter_end                           False                False   \n",
       "Is_quarter_start                         False                False   \n",
       "Is_year_end                              False                False   \n",
       "Is_year_start                            False                False   \n",
       "Elapsed                             1438300800           1438300800   \n",
       "StoreType                                    c                    a   \n",
       "Assortment                                   a                    a   \n",
       "CompetitionDistance                       1270                  570   \n",
       "CompetitionOpenSinceMonth                    9                   11   \n",
       "CompetitionOpenSinceYear                  2008                 2007   \n",
       "Promo2                                       0                    1   \n",
       "Promo2SinceWeek                              1                   13   \n",
       "...                                        ...                  ...   \n",
       "Min_Sea_Level_PressurehPa                 1015                 1017   \n",
       "Max_VisibilityKm                            31                   10   \n",
       "Mean_VisibilityKm                           15                   10   \n",
       "Min_VisibilitykM                            10                   10   \n",
       "Max_Wind_SpeedKm_h                          24                   14   \n",
       "Mean_Wind_SpeedKm_h                         11                   11   \n",
       "Max_Gust_SpeedKm_h                         NaN                  NaN   \n",
       "Precipitationmm                              0                    0   \n",
       "CloudCover                                   1                    4   \n",
       "Events                                     Fog                  Fog   \n",
       "WindDirDegrees                              13                  309   \n",
       "StateName                               Hessen           Thueringen   \n",
       "CompetitionOpenSince       2008-09-15 00:00:00  2007-11-15 00:00:00   \n",
       "CompetitionDaysOpen                       2510                 2815   \n",
       "CompetitionMonthsOpen                       24                   24   \n",
       "Promo2Since                1900-01-01 00:00:00  2010-03-29 00:00:00   \n",
       "Promo2Days                                   0                 1950   \n",
       "Promo2Weeks                                  0                   25   \n",
       "AfterSchoolHoliday                           0                    0   \n",
       "BeforeSchoolHoliday                          0                    0   \n",
       "AfterStateHoliday                           57                   67   \n",
       "BeforeStateHoliday                           0                    0   \n",
       "AfterPromo                                   0                    0   \n",
       "BeforePromo                                  0                    0   \n",
       "SchoolHoliday_bw                             5                    5   \n",
       "StateHoliday_bw                              0                    0   \n",
       "Promo_bw                                     5                    5   \n",
       "SchoolHoliday_fw                             7                    1   \n",
       "StateHoliday_fw                              0                    0   \n",
       "Promo_fw                                     5                    1   \n",
       "\n",
       "                                             2                    3  \\\n",
       "index                                        2                    3   \n",
       "Store                                        3                    4   \n",
       "DayOfWeek                                    5                    5   \n",
       "Date                       2015-07-31 00:00:00  2015-07-31 00:00:00   \n",
       "Sales                                     8314                13995   \n",
       "Customers                                  821                 1498   \n",
       "Open                                         1                    1   \n",
       "Promo                                        1                    1   \n",
       "StateHoliday                             False                False   \n",
       "SchoolHoliday                                1                    1   \n",
       "Year                                      2015                 2015   \n",
       "Month                                        7                    7   \n",
       "Week                                        31                   31   \n",
       "Day                                         31                   31   \n",
       "Dayofweek                                    4                    4   \n",
       "Dayofyear                                  212                  212   \n",
       "Is_month_end                              True                 True   \n",
       "Is_month_start                           False                False   \n",
       "Is_quarter_end                           False                False   \n",
       "Is_quarter_start                         False                False   \n",
       "Is_year_end                              False                False   \n",
       "Is_year_start                            False                False   \n",
       "Elapsed                             1438300800           1438300800   \n",
       "StoreType                                    a                    c   \n",
       "Assortment                                   a                    c   \n",
       "CompetitionDistance                      14130                  620   \n",
       "CompetitionOpenSinceMonth                   12                    9   \n",
       "CompetitionOpenSinceYear                  2006                 2009   \n",
       "Promo2                                       1                    0   \n",
       "Promo2SinceWeek                             14                    1   \n",
       "...                                        ...                  ...   \n",
       "Min_Sea_Level_PressurehPa                 1017                 1014   \n",
       "Max_VisibilityKm                            31                   10   \n",
       "Mean_VisibilityKm                           14                   10   \n",
       "Min_VisibilitykM                            10                   10   \n",
       "Max_Wind_SpeedKm_h                          14                   23   \n",
       "Mean_Wind_SpeedKm_h                          5                   16   \n",
       "Max_Gust_SpeedKm_h                         NaN                  NaN   \n",
       "Precipitationmm                              0                    0   \n",
       "CloudCover                                   2                    6   \n",
       "Events                                     Fog                  NaN   \n",
       "WindDirDegrees                             354                  282   \n",
       "StateName                   NordrheinWestfalen               Berlin   \n",
       "CompetitionOpenSince       2006-12-15 00:00:00  2009-09-15 00:00:00   \n",
       "CompetitionDaysOpen                       3150                 2145   \n",
       "CompetitionMonthsOpen                       24                   24   \n",
       "Promo2Since                2011-04-04 00:00:00  1900-01-01 00:00:00   \n",
       "Promo2Days                                1579                    0   \n",
       "Promo2Weeks                                 25                    0   \n",
       "AfterSchoolHoliday                           0                    0   \n",
       "BeforeSchoolHoliday                          0                    0   \n",
       "AfterStateHoliday                           57                   67   \n",
       "BeforeStateHoliday                           0                    0   \n",
       "AfterPromo                                   0                    0   \n",
       "BeforePromo                                  0                    0   \n",
       "SchoolHoliday_bw                             5                    5   \n",
       "StateHoliday_bw                              0                    0   \n",
       "Promo_bw                                     5                    5   \n",
       "SchoolHoliday_fw                             5                    1   \n",
       "StateHoliday_fw                              0                    0   \n",
       "Promo_fw                                     5                    1   \n",
       "\n",
       "                                             4  \n",
       "index                                        4  \n",
       "Store                                        5  \n",
       "DayOfWeek                                    5  \n",
       "Date                       2015-07-31 00:00:00  \n",
       "Sales                                     4822  \n",
       "Customers                                  559  \n",
       "Open                                         1  \n",
       "Promo                                        1  \n",
       "StateHoliday                             False  \n",
       "SchoolHoliday                                1  \n",
       "Year                                      2015  \n",
       "Month                                        7  \n",
       "Week                                        31  \n",
       "Day                                         31  \n",
       "Dayofweek                                    4  \n",
       "Dayofyear                                  212  \n",
       "Is_month_end                              True  \n",
       "Is_month_start                           False  \n",
       "Is_quarter_end                           False  \n",
       "Is_quarter_start                         False  \n",
       "Is_year_end                              False  \n",
       "Is_year_start                            False  \n",
       "Elapsed                             1438300800  \n",
       "StoreType                                    a  \n",
       "Assortment                                   a  \n",
       "CompetitionDistance                      29910  \n",
       "CompetitionOpenSinceMonth                    4  \n",
       "CompetitionOpenSinceYear                  2015  \n",
       "Promo2                                       0  \n",
       "Promo2SinceWeek                              1  \n",
       "...                                        ...  \n",
       "Min_Sea_Level_PressurehPa                 1016  \n",
       "Max_VisibilityKm                            10  \n",
       "Mean_VisibilityKm                           10  \n",
       "Min_VisibilitykM                            10  \n",
       "Max_Wind_SpeedKm_h                          14  \n",
       "Mean_Wind_SpeedKm_h                         11  \n",
       "Max_Gust_SpeedKm_h                         NaN  \n",
       "Precipitationmm                              0  \n",
       "CloudCover                                   4  \n",
       "Events                                     NaN  \n",
       "WindDirDegrees                             290  \n",
       "StateName                              Sachsen  \n",
       "CompetitionOpenSince       2015-04-15 00:00:00  \n",
       "CompetitionDaysOpen                        107  \n",
       "CompetitionMonthsOpen                        3  \n",
       "Promo2Since                1900-01-01 00:00:00  \n",
       "Promo2Days                                   0  \n",
       "Promo2Weeks                                  0  \n",
       "AfterSchoolHoliday                           0  \n",
       "BeforeSchoolHoliday                          0  \n",
       "AfterStateHoliday                           57  \n",
       "BeforeStateHoliday                           0  \n",
       "AfterPromo                                   0  \n",
       "BeforePromo                                  0  \n",
       "SchoolHoliday_bw                             5  \n",
       "StateHoliday_bw                              0  \n",
       "Promo_bw                                     5  \n",
       "SchoolHoliday_fw                             1  \n",
       "StateHoliday_fw                              0  \n",
       "Promo_fw                                     1  \n",
       "\n",
       "[93 rows x 5 columns]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head().T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "844338"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n = len(train_df); n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Experimenting with a sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "idx = np.random.permutation(range(n))[:2000]\n",
    "idx.sort()\n",
    "small_train_df = train_df.iloc[idx[:1000]]\n",
    "small_test_df = train_df.iloc[idx[1000:]]\n",
    "small_cont_vars = ['CompetitionDistance', 'Mean_Humidity']\n",
    "small_cat_vars =  ['Store', 'DayOfWeek', 'PromoInterval']\n",
    "small_train_df = small_train_df[small_cat_vars + small_cont_vars + ['Sales']]\n",
    "small_test_df = small_test_df[small_cat_vars + small_cont_vars + ['Sales']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Store</th>\n",
       "      <th>DayOfWeek</th>\n",
       "      <th>PromoInterval</th>\n",
       "      <th>CompetitionDistance</th>\n",
       "      <th>Mean_Humidity</th>\n",
       "      <th>Sales</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>280</th>\n",
       "      <td>281</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6970.0</td>\n",
       "      <td>61</td>\n",
       "      <td>8053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>584</th>\n",
       "      <td>586</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>250.0</td>\n",
       "      <td>61</td>\n",
       "      <td>17879</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>588</th>\n",
       "      <td>590</td>\n",
       "      <td>5</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>4520.0</td>\n",
       "      <td>51</td>\n",
       "      <td>7250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>847</th>\n",
       "      <td>849</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>67</td>\n",
       "      <td>10829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>896</th>\n",
       "      <td>899</td>\n",
       "      <td>5</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>2590.0</td>\n",
       "      <td>55</td>\n",
       "      <td>5952</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Store  DayOfWeek    PromoInterval  CompetitionDistance  Mean_Humidity  \\\n",
       "280    281          5              NaN               6970.0             61   \n",
       "584    586          5              NaN                250.0             61   \n",
       "588    590          5  Jan,Apr,Jul,Oct               4520.0             51   \n",
       "847    849          5              NaN               5000.0             67   \n",
       "896    899          5  Jan,Apr,Jul,Oct               2590.0             55   \n",
       "\n",
       "     Sales  \n",
       "280   8053  \n",
       "584  17879  \n",
       "588   7250  \n",
       "847  10829  \n",
       "896   5952  "
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Store</th>\n",
       "      <th>DayOfWeek</th>\n",
       "      <th>PromoInterval</th>\n",
       "      <th>CompetitionDistance</th>\n",
       "      <th>Mean_Humidity</th>\n",
       "      <th>Sales</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>428412</th>\n",
       "      <td>921</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>840.0</td>\n",
       "      <td>89</td>\n",
       "      <td>8343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>428541</th>\n",
       "      <td>1050</td>\n",
       "      <td>2</td>\n",
       "      <td>Mar,Jun,Sept,Dec</td>\n",
       "      <td>13170.0</td>\n",
       "      <td>78</td>\n",
       "      <td>4945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>428813</th>\n",
       "      <td>209</td>\n",
       "      <td>1</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>11680.0</td>\n",
       "      <td>85</td>\n",
       "      <td>4946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>430157</th>\n",
       "      <td>414</td>\n",
       "      <td>6</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>6210.0</td>\n",
       "      <td>88</td>\n",
       "      <td>6952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>431137</th>\n",
       "      <td>285</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2410.0</td>\n",
       "      <td>57</td>\n",
       "      <td>5377</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Store  DayOfWeek     PromoInterval  CompetitionDistance  \\\n",
       "428412    921          2               NaN                840.0   \n",
       "428541   1050          2  Mar,Jun,Sept,Dec              13170.0   \n",
       "428813    209          1   Jan,Apr,Jul,Oct              11680.0   \n",
       "430157    414          6   Jan,Apr,Jul,Oct               6210.0   \n",
       "431137    285          5               NaN               2410.0   \n",
       "\n",
       "        Mean_Humidity  Sales  \n",
       "428412             89   8343  \n",
       "428541             78   4945  \n",
       "428813             85   4946  \n",
       "430157             88   6952  \n",
       "431137             57   5377  "
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "categorify = Categorify(small_cat_vars, small_cont_vars)\n",
    "categorify(small_train_df)\n",
    "categorify(small_test_df, test=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Store</th>\n",
       "      <th>DayOfWeek</th>\n",
       "      <th>PromoInterval</th>\n",
       "      <th>CompetitionDistance</th>\n",
       "      <th>Mean_Humidity</th>\n",
       "      <th>Sales</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>428412</th>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>840.0</td>\n",
       "      <td>89</td>\n",
       "      <td>8343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>428541</th>\n",
       "      <td>1050.0</td>\n",
       "      <td>2</td>\n",
       "      <td>Mar,Jun,Sept,Dec</td>\n",
       "      <td>13170.0</td>\n",
       "      <td>78</td>\n",
       "      <td>4945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>428813</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>11680.0</td>\n",
       "      <td>85</td>\n",
       "      <td>4946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>430157</th>\n",
       "      <td>414.0</td>\n",
       "      <td>6</td>\n",
       "      <td>Jan,Apr,Jul,Oct</td>\n",
       "      <td>6210.0</td>\n",
       "      <td>88</td>\n",
       "      <td>6952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>431137</th>\n",
       "      <td>285.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2410.0</td>\n",
       "      <td>57</td>\n",
       "      <td>5377</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Store DayOfWeek     PromoInterval  CompetitionDistance  \\\n",
       "428412     NaN         2               NaN                840.0   \n",
       "428541  1050.0         2  Mar,Jun,Sept,Dec              13170.0   \n",
       "428813     NaN         1   Jan,Apr,Jul,Oct              11680.0   \n",
       "430157   414.0         6   Jan,Apr,Jul,Oct               6210.0   \n",
       "431137   285.0         5               NaN               2410.0   \n",
       "\n",
       "        Mean_Humidity  Sales  \n",
       "428412             89   8343  \n",
       "428541             78   4945  \n",
       "428813             85   4946  \n",
       "430157             88   6952  \n",
       "431137             57   5377  "
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Feb,May,Aug,Nov', 'Jan,Apr,Jul,Oct', 'Mar,Jun,Sept,Dec'], dtype='object')"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_train_df.PromoInterval.cat.categories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "280   -1\n",
       "584   -1\n",
       "588    1\n",
       "847   -1\n",
       "896    1\n",
       "dtype: int8"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_train_df['PromoInterval'].cat.codes[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fill_missing = FillMissing(small_cat_vars, small_cont_vars)\n",
    "fill_missing(small_train_df)\n",
    "fill_missing(small_test_df, test=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Store</th>\n",
       "      <th>DayOfWeek</th>\n",
       "      <th>PromoInterval</th>\n",
       "      <th>CompetitionDistance</th>\n",
       "      <th>Mean_Humidity</th>\n",
       "      <th>Sales</th>\n",
       "      <th>CompetitionDistance_na</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>78375</th>\n",
       "      <td>622</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2380.0</td>\n",
       "      <td>71</td>\n",
       "      <td>5390</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>161185</th>\n",
       "      <td>622</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2380.0</td>\n",
       "      <td>91</td>\n",
       "      <td>2659</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>363369</th>\n",
       "      <td>879</td>\n",
       "      <td>4</td>\n",
       "      <td>Feb,May,Aug,Nov</td>\n",
       "      <td>2380.0</td>\n",
       "      <td>73</td>\n",
       "      <td>4788</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Store DayOfWeek    PromoInterval  CompetitionDistance  Mean_Humidity  \\\n",
       "78375    622         5              NaN               2380.0             71   \n",
       "161185   622         6              NaN               2380.0             91   \n",
       "363369   879         4  Feb,May,Aug,Nov               2380.0             73   \n",
       "\n",
       "        Sales  CompetitionDistance_na  \n",
       "78375    5390                    True  \n",
       "161185   2659                    True  \n",
       "363369   4788                    True  "
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "small_train_df[small_train_df['CompetitionDistance_na'] == True]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Preparing full data set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_df = pd.read_pickle(path/'train_clean')\n",
    "test_df = pd.read_pickle(path/'test_clean')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(844338, 41088)"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_df),len(test_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "procs=[FillMissing, Categorify, Normalize]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen',\n",
    "    'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear',\n",
    "    'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw',\n",
    "    'SchoolHoliday_fw', 'SchoolHoliday_bw']\n",
    "\n",
    "cont_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC',\n",
    "   'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', \n",
    "   'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE',\n",
    "   'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dep_var = 'Sales'\n",
    "df = train_df[cat_vars + cont_vars + [dep_var,'Date']].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Timestamp('2015-08-01 00:00:00'), Timestamp('2015-09-17 00:00:00'))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df['Date'].min(), test_df['Date'].max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "41395"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cut = train_df['Date'][(train_df['Date'] == train_df['Date'][len(test_df)])].index.max()\n",
    "cut"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valid_idx = range(cut)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     5263\n",
       "1     6064\n",
       "2     8314\n",
       "3    13995\n",
       "4     4822\n",
       "Name: Sales, dtype: int64"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[dep_var].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = (TabularList.from_df(df, path=path, cat_names=cat_vars, cont_names=cont_vars, procs=procs)\n",
    "                   .split_by_idx(valid_idx)\n",
    "                   .label_from_df(cols=dep_var, label_cls=FloatList, log=True)\n",
    "                   .databunch())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "doc(FloatList)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "max_log_y = np.log(np.max(train_df['Sales'])*1.2)\n",
    "y_range = torch.tensor([0, max_log_y], device=defaults.device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = tabular_learner(data, layers=[1000,500], ps=[0.001,0.01], emb_drop=0.04, \n",
    "                        y_range=y_range, metrics=exp_rmspe)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "TabularModel(\n",
       "  (embeds): ModuleList(\n",
       "    (0): Embedding(1116, 50)\n",
       "    (1): Embedding(8, 5)\n",
       "    (2): Embedding(4, 3)\n",
       "    (3): Embedding(13, 7)\n",
       "    (4): Embedding(32, 17)\n",
       "    (5): Embedding(3, 2)\n",
       "    (6): Embedding(26, 14)\n",
       "    (7): Embedding(27, 14)\n",
       "    (8): Embedding(5, 3)\n",
       "    (9): Embedding(4, 3)\n",
       "    (10): Embedding(4, 3)\n",
       "    (11): Embedding(24, 13)\n",
       "    (12): Embedding(9, 5)\n",
       "    (13): Embedding(13, 7)\n",
       "    (14): Embedding(53, 27)\n",
       "    (15): Embedding(22, 12)\n",
       "    (16): Embedding(7, 4)\n",
       "    (17): Embedding(7, 4)\n",
       "    (18): Embedding(4, 3)\n",
       "    (19): Embedding(4, 3)\n",
       "    (20): Embedding(9, 5)\n",
       "    (21): Embedding(9, 5)\n",
       "    (22): Embedding(3, 2)\n",
       "    (23): Embedding(3, 2)\n",
       "  )\n",
       "  (emb_drop): Dropout(p=0.04)\n",
       "  (bn_cont): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (layers): Sequential(\n",
       "    (0): Linear(in_features=229, out_features=1000, bias=True)\n",
       "    (1): ReLU(inplace)\n",
       "    (2): BatchNorm1d(1000, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (3): Dropout(p=0.001)\n",
       "    (4): Linear(in_features=1000, out_features=500, bias=True)\n",
       "    (5): ReLU(inplace)\n",
       "    (6): BatchNorm1d(500, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (7): Dropout(p=0.01)\n",
       "    (8): Linear(in_features=500, out_features=1, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "learn.model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data.train_ds.cont_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
     ]
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total time: 14:18\n",
      "epoch  train_loss  valid_loss  exp_rmspe\n",
      "1      0.021467    0.023627    0.149858   (02:49)\n",
      "2      0.017700    0.018403    0.128610   (02:52)\n",
      "3      0.014242    0.015516    0.116233   (02:51)\n",
      "4      0.012754    0.011944    0.108742   (02:53)\n",
      "5      0.010238    0.012665    0.105895   (02:52)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "learn.fit_one_cycle(5, 1e-3, wd=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn.save('1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_losses(last=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn.load('1');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total time: 13:52\n",
      "epoch  train_loss  valid_loss  exp_rmspe\n",
      "1      0.018280    0.021080    0.118549   (02:49)\n",
      "2      0.018260    0.015992    0.121107   (02:50)\n",
      "3      0.015710    0.015826    0.113787   (02:44)\n",
      "4      0.011987    0.013806    0.109169   (02:43)\n",
      "5      0.011023    0.011944    0.104263   (02:42)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "learn.fit_one_cycle(5, 3e-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "Total time: 14:41 <p><table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>exp_rmspe</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.012831</th>\n",
       "    <th>0.012518</th>\n",
       "    <th>0.106848</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.011145</th>\n",
       "    <th>0.013722</th>\n",
       "    <th>0.109208</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.011676</th>\n",
       "    <th>0.015752</th>\n",
       "    <th>0.115598</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>4</th>\n",
       "    <th>0.009419</th>\n",
       "    <th>0.012901</th>\n",
       "    <th>0.107179</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>5</th>\n",
       "    <th>0.009156</th>\n",
       "    <th>0.011122</th>\n",
       "    <th>0.103746</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "\n",
       "  </tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(5, 3e-4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(10th place in the competition was 0.108)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## fin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
